KubernetesのPodに機密情報を受け渡してみる
ECSコンテナ内への機密情報(DB接続情報など)の受け渡しが非常に簡単になりました!!
なるほどなるほど。。
ではKubernetesの場合どうやって機密情報を受け渡せば良いの??そんな思いが込み上げてきたのでKubernetesでの機密情報の受け渡しについて調べてみました。
機密情報の受け渡しにはSecretリソースを使おう
Kubernetesで機密情報を管理するにはSecretリソースを利用します。Secretリソースを利用することで機密情報をより安全に扱うことができます。 Podから機密情報を取得するまでのフローは以下のようになります。
- kubectlを使用しSecretを作成する(機密情報はMasterのetcd(KVS)に保持されます)
- PodからSecretを読み込む
簡単ですね。 Secretを作成する方法はいくつかありますが、今回は「定義ファイルから作成する」方法を試してみようと思います。また、PodのSecretの読み込みに関しても同様にいくつか方法はありますが、「環境変数として読み込む」方法を試してみようと思います。
実行環境
- Docker for Mac:Version 18.06.1-ce-mac73
- Kubernetes:v1.10.3
kubectlを使用しSecretを作成する
機密情報としてusername
、password
をPodに引き渡すことにします。
username
、password
の値であるadmin
やP@ssw0rd
は、そのままの状態ではなくbase64でエンコードした状態で定義ファイルに記載します。
$ echo -n 'admin' | base64 YWRtaW4= $ echo -n 'P@ssw0rd' | base64 UEBzc3cwcmQ=
エンコードした値を定義ファイルに記載します。
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: UEBzc3cwcmQ=
次に定義ファイルを元にSecretリソースを作成し、登録された情報を確認してみます。
$ kubectl create -f ./secret.yaml secret/mysecret created $ kubectl get secrets mysecret -o yaml apiVersion: v1 data: password: UEBzc3cwcmQ= username: YWRtaW4= kind: Secret metadata: creationTimestamp: 2018-11-23T07:47:11Z name: mysecret namespace: default resourceVersion: "902527" selfLink: /api/v1/namespaces/default/secrets/mysecret uid: fc841b26-eef3-11e8-9146-025000000001 type: Opaque
Secretリソースが登録されました。
PodからSecretを読み込む
Secretを環境変数で読み込むためのPodの定義ファイルを作成します。
apiVersion: v1 kind: Pod metadata: name: sample-pod spec: containers: - name: nginx-container image: nginx:1.14 env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: mysecret key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: mysecret key: password
この定義ファイルを利用しPodを作成します。
$ kubectl apply -f sample-pod.yaml pod/sample-pod created
Podに接続し環境変数が読み込めているか確認してみましょう!
$kubectl exec -it sample-pod env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=sample-pod SECRET_USERNAME=admin SECRET_PASSWORD=P@ssw0rd ・・・・
ちゃんと機密情報を受け渡せました!!
あとがき
Secretリソースを使うことでPodに機密情報を受け渡すことができました。ただyamlファイル自体の機密情報はbase64でエンコードされているだけなので十分注意して扱う必要があります。 yamlファイルをリポジトリ管理する場合はkubesecなどのソフトウェアで機密情報を暗号化することをオススメします。